/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tela.iptsp;

import ferramentas.CFG;
import ferramentas.Comunicacao;
import ferramentas.Query;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.UnsupportedDataTypeException;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author Lauro
 */
public class formularioIPTSP2 extends HttpServlet {

    private static final String TMP_DIR_PATH = System.getProperty("java.io.tmpdir");
    private File tmpDir = new File(TMP_DIR_PATH);
    private int MAX_SIZE_UPLOAD = 5 * 1024 * 1024; // 5Mb
    private String ENCODING = "UTF-8";
    private String email;
    private String nome;
    private int id;

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, MessagingException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
            String finalInscricoesString = "01/02/2012 00:00:00";
            Date finalInscricoes = formatter.parse(finalInscricoesString);
            Date agora = new Date();

            if (agora.after(finalInscricoes)) {
                throw new UnsupportedDataTypeException();
            }else{
            ServletFileUpload handler = getHandler();

            // Check that we have a file upload request
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                List items = getItemsRequest(request, handler);

                out.println("<html>");
                out.println("<head>");
                out.println("<title>Servlet formularioCurso</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("Aguarde...<br />");

                String cpf = getParameter("cpf", items);
                cpf = cpf.replaceAll("\\.", "");
                cpf = cpf.replaceAll("-", "");

                Query q = new Query();

                boolean isCadastrado = false;
                if (!cpf.isEmpty()) {
                    isCadastrado = q.isUsuarioCadastradoIPTSP2(cpf);
                }

                if (!isCadastrado) {
                    // == DADOS PESSOAIS
                    nome = getParameter("nome", items);
                    String nascimento = getParameter("nascimento", items);

                    String rg = getParameter("rg", items);
                    String orgao_expedidor = getParameter("orgao_expedidor", items);


                    // == ENDEREÇO
                    String rua = getParameter("rua", items);
                    String complemento = getParameter("complemento", items);
                    String bairro = getParameter("bairro", items);
                    String cidade = getParameter("cidade", items);
                    String estado = getParameter("estado", items);
                    String cep = getParameter("cep", items);
                    cep = cep.replaceAll("-", "");

                    // == CONTATO
                    String telefone_residencial = getParameter("telefone_residencial", items);
                    String telefone_celular = getParameter("telefone_celular", items);
                    email = getParameter("email", items);

                    // == POLO DE APOIO PRESENCIAL
                    String polo = getParameter("polo", items);



                    // == INFORMAÇÕES PROFISSIONAIS
                    // SUS
                    String esfera_sus = getParameter("esfera_sus", items);


                    // ÁREA DE ATUAÇÃO
                    String atividade_profissional = getParameter("atividade_profissional", items);
                    if (atividade_profissional.equalsIgnoreCase("outra")) {
                        atividade_profissional += ": " + getParameter("atividade_profissional_outra", items);
                    }
                    String atividade_profissional_instituicao = getParameter("atividade_profissional_instituicao", items);
                    String atividade_profissional_area = getParameter("atividade_profissional_area", items);
                    String atividade_profissional_inicio = getParameter("atividade_profissional_inicio", items);

                    // == INFORMAÇÕES ACADÊMICAS
                    // = FORMAÇÃO
                    // GRADUAÇÃO
                    String graduacao = getParameter("graduacao", items);

                    // PÓS-GRADUAÇÃO - Espec.
                    String pos_especializacao = getParameter("pos_especializacao", items);
                    // PÓS-GRADUAÇÃO - Mestrado
                    String pos_mestrado = getParameter("pos_mestrado", items);
                    // PÓS-GRADUAÇÃO - Doutorado
                    String pos_doutorado = getParameter("pos_doutorado", items);
                    // FORMAÇÃO - OUTROS
                    String formacao_outros = getParameter("formacao_outros", items);

                    // = ÁREA DE INTERESSE
                    String area_interesse = getParameter("area_interesse", items);
                    if (area_interesse.equalsIgnoreCase("outra")) {
                        area_interesse += ": " + getParameter("area_interesse_outra", items);
                    }

                    // = ÁREA DE INSCRIÇÃO
                    String area_inscricao = getParameter("area_inscricao", items);


                    // == MOTIVAÇÃO
                    String motivacao = getParameter("motivacao", items);
                    motivacao = motivacao.replaceAll("'", "").replace("\"", "");


                    // == MINICURRICULO
                    int m1_1 = Integer.parseInt(getParameter("m1_1", items));
                    int m1_2 = Integer.parseInt(getParameter("m1_2", items));
                    int m1_3 = Integer.parseInt(getParameter("m1_3", items));
                    int m1_4 = Integer.parseInt(getParameter("m1_4", items));
                    int m1_5 = Integer.parseInt(getParameter("m1_5", items));
                    int m1_6 = Integer.parseInt(getParameter("m1_6", items));
                    int m2_1 = Integer.parseInt(getParameter("m2_1", items));
                    int m2_2 = Integer.parseInt(getParameter("m2_2", items));
                    int m2_3 = Integer.parseInt(getParameter("m2_3", items));
                    int m2_4 = Integer.parseInt(getParameter("m2_4", items));
                    int m2_5 = Integer.parseInt(getParameter("m2_5", items));
                    int m3_1 = Integer.parseInt(getParameter("m3_1", items));
                    int m3_2 = Integer.parseInt(getParameter("m3_2", items));
                    int m3_3 = Integer.parseInt(getParameter("m3_3", items));
                    int m3_4 = Integer.parseInt(getParameter("m3_4", items));
                    int m3_5 = Integer.parseInt(getParameter("m3_5", items));
                    int m3_6 = Integer.parseInt(getParameter("m3_6", items));
                    int m3_7 = Integer.parseInt(getParameter("m3_7", items));
                    int m3_8 = Integer.parseInt(getParameter("m3_8", items));
                    int m3_9 = Integer.parseInt(getParameter("m3_9", items));
                    int m3_10 = Integer.parseInt(getParameter("m3_10", items));
                    int m3_11 = Integer.parseInt(getParameter("m3_11", items));


                    // == COMPROVANTES
                    FileItem comprovante_graduacao = getFile("comprovante_graduacao", items);
                    FileItem comprovante = getFile("comprovante", items);
                    FileItem carta_comprimisso = getFile("carta_comprimisso", items);
                    FileItem termo_comprimisso = getFile("termo_comprimisso", items);

                    String caminhoArquivo = "";
                    File arquivoDocumento = null;
                    // Salvar comprovante_graduacao
                    String extensao_arquivo1 = "";
                    if (comprovante_graduacao.getSize() > 0) {
                        extensao_arquivo1 = getExtensaoArquivo(comprovante_graduacao.getName());
                        caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_COMPROVANTE_GRADUACAO+ System.getProperty("file.separator") + cpf + extensao_arquivo1;
                        arquivoDocumento = new File(caminhoArquivo);
                        comprovante_graduacao.write(arquivoDocumento);
                    }
                    // Salvar comprovante
                    String extensao_arquivo2 = "";
                    if (comprovante.getSize() > 0) {
                        extensao_arquivo2 = getExtensaoArquivo(comprovante.getName());
                        caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_COMPROVANTE+ System.getProperty("file.separator") + cpf + extensao_arquivo2;
                        arquivoDocumento = new File(caminhoArquivo);
                        comprovante.write(arquivoDocumento);
                    }
                    // Salvar carta_comprimisso
                    String extensao_arquivo3 = "";
                    if (carta_comprimisso.getSize() > 0) {
                        extensao_arquivo3 = getExtensaoArquivo(carta_comprimisso.getName());
                        caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_CARTA_COMPROMISSO+ System.getProperty("file.separator") + cpf + extensao_arquivo3;
                        arquivoDocumento = new File(caminhoArquivo);
                        carta_comprimisso.write(arquivoDocumento);
                    }
                    // Salvar termo_comprimisso
                    String extensao_arquivo4 = "";
                    if (termo_comprimisso.getSize() > 0) {
                        extensao_arquivo4 = getExtensaoArquivo(termo_comprimisso.getName());
                        caminhoArquivo = getPastaDocumentos() + CFG.IPTSP2_TERMO_COMPROMISSO+ System.getProperty("file.separator") + cpf + extensao_arquivo4;
                        arquivoDocumento = new File(caminhoArquivo);
                        termo_comprimisso.write(arquivoDocumento);
                    }

                    id = q.cadastraIPTSP2(getSQL(), nome, nascimento, rg, orgao_expedidor, cpf, rua, complemento, bairro, cidade, estado, cep, telefone_residencial, telefone_celular, email, polo,
                            esfera_sus, atividade_profissional, atividade_profissional_instituicao, atividade_profissional_area, atividade_profissional_inicio, graduacao,
                            pos_especializacao, pos_mestrado, pos_doutorado, formacao_outros, area_interesse, area_inscricao, motivacao,
                            m1_1, m1_2, m1_3, m1_4, m1_5, m1_6,
                            m2_1, m2_2, m2_3, m2_4, m2_5,
                            m3_1, m3_2, m3_3, m3_4, m3_5, m3_6, m3_7, m3_8, m3_9, m3_10, m3_11,
                            extensao_arquivo1, extensao_arquivo2, extensao_arquivo3, extensao_arquivo4);

                    out.println("Inscrição realizada com sucesso!.<br /> <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
                    out.println("<script>");
                    out.println("window.alert('Cadastrado com sucesso!');");
                    out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
                    out.println("</script>");
                    Comunicacao c = new Comunicacao();
                    String mensagem = "Olá, "+nome+". Sua inscrição no Curso de Geoprocessamento em Saúde, oferecido pela Universidade Federal de Goiás, de número " + id + ", foi confirmada.";
                    String assunto = "Confirmação de inscrição IPTSP - UFG";
                    c.enviarEmail(new String[]{email, "tiagomesq@gmail.com"}, assunto,mensagem, "noreply@ciar.ufg.br");
                    
                } else {
                    out.println("ERRO na inscrição! Usuário já está inscrito! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
                    out.println("<script>");
                    out.println("window.alert('Usuário já cadastrado!');");
                    out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
                    out.println("</script>");
                }
            } else {
                out.println("ERRO na inscrição! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
                out.println("<script>window.alert('Erro ao enviar arquivos!');history.go(-1);</script>");
            }
            }
        } catch (UnsupportedDataTypeException ex) {
            out.println("Não é mais possível se inscrever nesse curso! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
            System.out.println(ex);
            out.println("<script>");
            out.println("window.alert('Não é mais possível se inscrever nesse curso!');");
            out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
            out.println("</script>");
        } catch (Exception ex) {
            out.println("ERRO na inscrição! <a href='http://www.iptsp.ufg.br/geoprocessamento/'> Voltar à página do curso.</a>");
            System.out.println(ex);
            out.println("<script>");
            out.println("window.alert('Erro ao cadastrar! Entre em contato com Suporte para tentar resolver o seu problema.');");
            out.println("self.location ='http://www.iptsp.ufg.br/geoprocessamento';");
            out.println("</script>");
        } finally {
            
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
        
    }

    private ServletFileUpload getHandler() throws FileUploadException {
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        /*
         *Set the size threshold, above which content will be stored on disk.
         */
        //fileItemFactory.setSizeThreshold(MAX_SIZE_UPLOAD);
        /*
         * Set the temporary directory to store the uploaded files of size above threshold.
         */
        fileItemFactory.setRepository(tmpDir);

        ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
        uploadHandler.setHeaderEncoding(ENCODING);
        uploadHandler.setFileSizeMax(MAX_SIZE_UPLOAD);

        return uploadHandler;
    }

    private List getItemsRequest(HttpServletRequest request, ServletFileUpload uploadHandler) throws FileUploadException {
        return uploadHandler.parseRequest(request);
    }

    private String getParameter(String fieldName, List items) throws UnsupportedEncodingException {
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(fieldName)) {
                    return new String(item.getString().getBytes("iso-8859-1"), "UTF-8");
                }
            }
        }
        return null;
    }

    private FileItem getFile(String fieldName, List items) {
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (!item.isFormField()) {
                if (item.getFieldName().equalsIgnoreCase(fieldName)) {
                    return item;
                }
            }
        }
        return null;
    }

    private String getPastaDocumentos() {
        String root = getServletContext().getRealPath("/");
        /*String localDocumentos = root.substring(0, root.lastIndexOf(getServletContext().getContextPath().replace("/", System.getProperty("file.separator"))))
                + System.getProperty("file.separator") + CFG.DIRETORIO_ARQUIVOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_IPTSP2;*/
        String localDocumentos = "/var/lib/tomcat6/webapps/" + CFG.DIRETORIO_ARQUIVOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS
                + System.getProperty("file.separator") + CFG.DIRETORIO_DOCUMENTOS_IPTSP2;
        return localDocumentos + System.getProperty("file.separator");
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (MessagingException ex) {
            Logger.getLogger(formularioIPTSP2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (MessagingException ex) {
            Logger.getLogger(formularioIPTSP2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    public String getSQL() {
        return "INSERT INTO `bridge`.`formulario_iptsp2` ("
                + "`nome`, "
                + "`nascimento`, "
                + "`rg`, "
                + "`orgao_expedidor`, "
                + "`cpf`, "
                + "`rua`, "
                + "`complemento`, "
                + "`bairro`, "
                + "`cidade`, "
                + "`estado`, "
                + "`cep`, "
                + "`telefone_residencial`, "
                + "`telefone_celular`, "
                + "`email`, "
                + "`polo`, "
                + "`esfera_sus`, "
                + "`atividade_profissional`, "
                + "`atividade_profissional_instituicao`, "
                + "`atividade_profissional_area`, "
                + "`atividade_profissional_inicio`, "
                + "`graduacao`, "
                + "`pos_especializacao`, "
                + "`pos_mestrado`, "
                + "`pos_doutorado`, "
                + "`formacao_outros`, "
                + "`area_interesse`, "
                + "`area_incricao`, "
                + "`motivacao`, "
                + "`m1_1`, "
                + "`m1_2`, "
                + "`m1_3`, "
                + "`m1_4`, "
                + "`m1_5`, "
                + "`m1_6`, "
                + "`m2_1`, "
                + "`m2_2`, "
                + "`m2_3`, "
                + "`m2_4`, "
                + "`m2_5`, "
                + "`m3_1`, "
                + "`m3_2`, "
                + "`m3_3`, "
                + "`m3_4`, "
                + "`m3_5`, "
                + "`m3_6`, "
                + "`m3_7`, "
                + "`m3_8`, "
                + "`m3_9`, "
                + "`m3_10`, "
                + "`m3_11`, "
                + "`extensao_arquivo1`, "
                + "`extensao_arquivo2`, "
                + "`extensao_arquivo3`, "
                + "`extensao_arquivo4` "
                + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
    }

    private String getExtensaoArquivo(String name) {
        return name.substring(name.lastIndexOf("."), name.length());
    }
}
